package br.com.infnet.cultbook.repository.dao.impl;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.Query;

import br.com.infnet.cultbook.domain.produto.Livro;
import br.com.infnet.cultbook.repository.dao.LivroDAO;
import br.com.infnet.cultbook.repository.dao.common.impl.BaseDAOImpl;

@Stateless
public final class LivroDAOImpl extends BaseDAOImpl<Livro> implements LivroDAO {
	
	@Override
	@SuppressWarnings("unchecked")
	public List<Livro> buscarLivrosPorTipo(String valorTipoBusca, String tipoBusca) {
		Query query = manager.createQuery("from Livro l where l."+tipoBusca+ " like :valorTipoBusca order by l.titulo asc");
		query.setParameter("valorTipoBusca", "%" + valorTipoBusca + "%");
	
		return query.getResultList();
	}
	
	
	@SuppressWarnings("unchecked")
	public List<Livro> buscarDezMaisVendidos() {
		List<Livro> resultado = new ArrayList<Livro>();
		String queryDezMais = "select l.id, l.isbn, l.autor, l.preco, l.titulo, sum(ip.quantidade) as quantidade from " +
		"livro l, item_pedido ip where l.id = ip.livro_id group by " +
		"l.id, l.isbn, l.autor, l.preco, l.titulo order by quantidade desc limit 10";
		Query query = manager.createNativeQuery(queryDezMais);
		
		List livros = query.getResultList();
		for (Object object : livros) {
			Object[] result = (Object[]) object;
			Long id = ((BigInteger) result[0]).longValue();
			String isbn = (String) result[1];
			String autor = (String) result[2];
			BigDecimal preco = (BigDecimal) result[3];
			String titulo = (String) result[4];
			Livro livro = new Livro();
			livro.setId(id);
			livro.setIsbn(isbn);
			livro.setAutor(autor);
			livro.setPreco(preco);
			livro.setTitulo(titulo);
			resultado.add(livro);
		}

		return resultado;
	}
	
}
